package com.shujia.custom.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

public class MyGenericUDFDemo1 extends GenericUDF {

    /*
        这个方法主要是对自定义的UDF函数进行初始化，目的是指定调用完函数返回的值的类型
        需求：传入一个字符串，返回一个新的字符串
        举例：SMITH --> 数加：SMITH
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        //使用PrimitiveObjectInspectorFactory工厂类，获取String类型的ObjectInspector
        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }

    /*
        该方法是自定义UDF的核心方法，目的是实现自定义UDF的逻辑
        是在initialize方法之后执行的

        arguments将来会有多个参数，但是UDF函数只有一个参数，所以arguments[0]就是传入的第一个参数
     */
    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException { //xiaohu("smith")  xiaohu(60)
        String output = "";
        //arguments[0]获取第一个参数值，通过get()方法获取其中的参数具体值
        Object o = arguments[0].get(); // Object o = 100
        if (o != null) { //如果将来调用自定义函数不传值的话，则o为null，需要加入判断，防止空指针异常
            if (o instanceof Text) {
                output = "数加：" + o;
            }else if(o instanceof IntWritable){ // hive中传入整数的时候，底层默认是IntWritable类型的
                int score = ((IntWritable) o).get();
                if(score>=90 && score<=100){
                    output = "优秀";
                }else if(score>=70 && score<90){
                    output = "良好";
                }else if(score>=60){
                    output = "及格";
                }else {
                    output = "不及格";
                }
            }
        }
        return output;
    }

    @Override
    public String getDisplayString(String[] children) {
        return "这是我们自己使用新版本写法自定义的UDF函数";
    }
}
